<h3>介绍</h3>
<p>通用的微信服务端开发 SDK，基于<a href="https://github.com/hpyer/node-easywechat">node-easywechat</a>封装， 用于快速开发微信服务端应用，使用方式可以参考<a href="https://github.com/hpyer/node-easywechat">node-easywechat</a>文档。</p>
<p>重写了该插件的缓存，使其继承 cool-admin 的缓存。</p>
<h3>标识</h3>
<p>调用插件的时候需要用到标识，标识是唯一的，不能重复，建议使用英文，不要使用中文，对应插件 <code>plugin.json</code> 中的 <code>key</code> 字段</p>
<ul>
<li>标识：wx</li>
</ul>
<h3>配置</h3>
<p>以公众号为例，其它配置参考<a href="https://github.com/hpyer/node-easywechat">node-easywechat 文档</a></p>
<pre><code class="language-json">{
  &quot;OfficialAccount&quot;: {
    &quot;app_id&quot;: &quot;公众号的 app key&quot;,
    &quot;secret&quot;: &quot;公众号的 app secret&quot;,
    &quot;token&quot;: &quot;公众号的 token&quot;,
    &quot;aes_key&quot;: &quot;EncodingAESKey&quot;,
    &quot;oauth&quot;: {
      &quot;scope&quot;: &quot;网页授权类型 如：snsapi_userinfo&quot;,
      &quot;redirect&quot;: &quot;网页授权回调地址，完整的URL&quot;
    },
    &quot;use_stable_access_token&quot;: true
  }
}
</code></pre>
<p>小程序，其他以此类推</p>
<pre><code class="language-json">{
  &quot;MiniApp&quot;: {
    &quot;app_id&quot;: &quot;小程序的 app key&quot;,
    &quot;secret&quot;: &quot;小程序的 app secret&quot;
  }
}
</code></pre>
<p>配置有</p>
<ul>
<li>OfficialAccount：公众号</li>
<li>MiniApp：小程序</li>
<li>Pay：支付，不推荐</li>
<li>OpenPlatform：开放平台，如：app 登录</li>
<li>Work：企业微信</li>
<li>OpenWork：企业微信开放平台</li>
</ul>
<p>配置参考<a href="https://github.com/hpyer/node-easywechat">node-easywechat 文档</a></p>
<h3>方法</h3>
<p>下面是插件提供的一些方法</p>
<ul>
<li>OfficialAccount</li>
</ul>
<pre><code class="language-ts">   /**
   * 公众号
   * @param config
   * @returns
   */
  async OfficialAccount(config?)
</code></pre>
<ul>
<li>MiniApp</li>
</ul>
<pre><code class="language-ts">   /**
   * 小程序
   * @param config
   * @returns
   */
  async MiniApp(config?)
</code></pre>
<ul>
<li>Pay</li>
</ul>
<pre><code class="language-ts">   /**
   * 支付
   * @param config
   * @returns
   */
  async Pay(config?)
</code></pre>
<ul>
<li>OpenPlatform</li>
</ul>
<pre><code class="language-ts">   /**
   * 开放平台
   * @param config
   * @returns
   */
  async OpenPlatform(config?)
</code></pre>
<ul>
<li>Work</li>
</ul>
<pre><code class="language-ts">   /**
   * 企业微信
   * @param config
   * @returns
   */
  async Work(config?)
</code></pre>
<ul>
<li>OpenWork</li>
</ul>
<pre><code class="language-ts">   /**
   * 企业微信开放平台
   * @param config
   * @returns
   */
  async OpenWork(config?)
</code></pre>
<ul>
<li>createRequest</li>
</ul>
<pre><code class="language-ts">  /**
   * 创建请求
   * @param req Cool Admin中可以传入 this.ctx.req
   * @returns
   */
  async createRequest(req: IncomingMessage) {
    return await ServerRequest.createFromIncomingMessage(req);
  }
</code></pre>
<h3>调用示例</h3>
<ul>
<li>常用</li>
</ul>
<pre><code class="language-ts">@Inject()
pluginService: PluginService;

// 获取插件实例
const instance = await this.pluginService.getInstance(&#39;wx&#39;);

// 获得公众号实例
const OfficialAccount = await instance.OfficialAccount();

// 获取公众号的 access token
const token = await OfficialAccount.getAccessToken();
console.log(&#39;token&#39;, await token.getToken());
</code></pre>
<ul>
<li>根据公众号回调处理消息</li>
</ul>
<p>Controller</p>
<pre><code class="language-ts">import { CoolController, BaseController } from &quot;@cool-midway/core&quot;;
import { All, Inject, Query } from &quot;@midwayjs/core&quot;;
import { Context } from &quot;koa&quot;;
import { DemoMpService } from &quot;../../service/mp&quot;;

/**
 * 微信公众号
 */
@CoolController()
export class DemoMpController extends BaseController {
  @Inject()
  ctx: Context;

  @Inject()
  demoMpService: DemoMpService;

  // 注意需要开放这个接口，不能有权限校验
  @All(&quot;/callback&quot;, { summary: &quot;消息回调&quot; })
  async callback(@Query(&quot;label&quot;) label: string) {
    const response = await this.demoMpService.callback(label, this.ctx);
    this.ctx.type = response.getHeader(&quot;content-type&quot;);
    this.ctx.body = response.getBody();
  }
}
</code></pre>
<p>Service</p>
<pre><code class="language-ts">import { Inject, Provide } from &quot;@midwayjs/decorator&quot;;
import { BaseService } from &quot;@cool-midway/core&quot;;
import { Context } from &quot;koa&quot;;
import { PluginService } from &quot;../../plugin/service/info&quot;;

/**
 * 公众号
 */
@Provide()
export class DemoMpService extends BaseService {
  @Inject()
  pluginService: PluginService;

  /**
   * 回调
   * @param label 标签
   * @param ctx 请求上下文
   */
  async callback(label: string, ctx: Context) {
    const server = await this.getServer(ctx);
    server.with(async (message) =&gt; {
      if (message.MsgType == &quot;text&quot;) {
        console.log(&quot;message&quot;, message);
        return &quot;你好&quot;;
      }
    });
    return server.serve();
  }

  /**
   * 获得服务
   * @param ctx
   */
  async getServer(ctx: Context) {
    // 获取插件实例
    const instance = await this.pluginService.getInstance(&quot;wx&quot;);
    // 获得公众号实例
    const app = await instance.OfficialAccount();

    // 创建请求
    const request = await instance.createRequest(ctx.req);
    app.setRequest(request);

    // 获得服务
    const server = app.getServer();
    return server;
  }
}
</code></pre>
<h3>更新日志</h3>
<ul>
<li><p>v1.0.1 (2024-07-03)</p>
<ul>
<li>新增 createRequest 创建请求方法</li>
<li>新增处理微信公众号消息的示例</li>
</ul>
</li>
<li><p>v1.0.0 (2024-03-16)</p>
<ul>
<li>初始版本</li>
</ul>
</li>
</ul>
